package com.webserver.servlet;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.webserver.http.HttpContext;
import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;

import qrcode.QRCodeUtil;
/**
 * 生成二维码
 * @author pc
 *
 */
public class CreateQRCodeServlet extends HttpServlet{
	public void service(HttpRequest request,HttpResponse response) {
		System.out.println("CreateQRCodeServlet:开始生成二维码...");
		String content = request.getParameter("content");
		System.out.println("二维码内容:"+content);
		
		try {
//			FileOutputStream fos = new FileOutputStream("qr.jpg");
			/*
			 * java.io.ByteArrayOutputStream
			 * 他是一个低级流，流的另一端连接的是一个字节数组(实际上这个数组在这个
			 * 流的内部，它自己维护该数组)。通过这个流写出的字节都会保存到该字节数组
			 * 上。并且我们可以在写出后得到该数组中的所有字节。
			 */
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			/*
			 * 传入的4个参数分别是:
			 * 1:二维码上的内容
			 * 2:二维码图片中间的logo图片的路径，没有可以是null
			 * 3:输出流(二维码图片生成后对应的字节通过这个流写出)
			 * 4:图片是否压缩
			 */
//			QRCodeUtil.encode(content,null, fos,true);
			QRCodeUtil.encode(content,null, baos,true);
			
			//写出二维码数据完毕后，我们通过字节数组输出流得到写出的这组字节
			byte[] data = baos.toByteArray();//获取刚才写出的字节
			System.out.println("二维码图片的总字节量:"+data.length);
			
			
			
			System.out.println("二维码生成完毕!");
			/*
			 * 没有必要先将二维码图片生成后对应的这些字节写入文件，再把文件设置到
			 * response中，等到flush响应时再从文件中把这些字节读回来发给客户端。
			 * 
			 * 而是应该将二维码生成的这些字节直接交给response,作为正文内容发送给
			 * 客户端即可!
			 * 
			 * 现在这样的一次硬盘读写是完全没有意义和浪费资源的!
			 * 
			 */
//			File file = new File("qr.jpg");
//			response.setEntity(file);
			/*
			 * 直接将二维码生成的这组字节设置到response中，使其作为正文直接给客户端
			 * 发送回去。
			 */
			response.setContent(data);
			//设置响应头
			response.setHeader("Content-Type", HttpContext.getMimeType("jpg"));
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		System.out.println("CreateQRCodeServlet:二维码生成完毕!");
	}
}





